/**
 * 创建场景
 * 布置场景
 */
let APP = function () {
    let scene = new THREE.Scene();//定义场景
    let camera = [];//定义相机
    let point = new THREE.PointLight(0xffffff);//定义光源
    let ambient = new THREE.AmbientLight(0xffffff);//定义环境光
    let w = window.innerWidth;//场景宽
    let h = window.innerHeight;//场景高
    let k = w / h;
    let s = 200; //三维场景显示范围控制系数，系数越大，显示的范围越大
    let fbxLoader = new THREE.FBXLoader();//fbx加载器
    let mixer = null;
    let renderer = new THREE.WebGLRenderer();
    this.init = function () {//初始化程序
        point.position.set(100, 200, 300); //点光源位置
        scene.add(point);//将点光源添加到场景中
        scene.add(ambient);//添加环境光
        //创建摄像机
        camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
        camera.position.set(200, 300, 200); //设置相机位置
        camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
        this.render();
        /**
         * 调试区域
         */
        //this.loadOBJ();
        //this.modelLoad();
    };

    /**
     * 加载模型
     *
     */
    this.modelLoad = function () {
        fbxLoader.load('fbx/xiongmao.fbx', function (obj) {
            mixer = new THREE.AnimationMixer(obj);
            var AnimationAction = mixer.clipAction(obj.animations[0]);
            // AnimationAction.timeScale = 1; //默认1，可以调节播放速度
            // AnimationAction.loop = THREE.LoopOnce; //不循环播放
            // AnimationAction.clampWhenFinished=true;//暂停在最后一帧播放的状态
            AnimationAction.play();//播放动画

            obj.traverse(function(child)
            {
                if (child instanceof THREE.Mesh)
                {
                    //将贴图赋于材质
                    //child.material.map = texture;
                    //重点，没有该句会导致PNG无法正确显示透明效果

                    child.material.emissive =  child.material.color;
                    child.material.emissiveMap = child.material.map ;
                    child.material.transparent = true;
                }
            });

            obj.scale.set(0.1,0.1,0.1);
            scene.add(obj);



            let T0 = new Date();//上次时间
            function render1() {
                let T1 = new Date();//本次时间
                let t = T1-T0;//时间差
                T0 = T1;//把本次时间赋值给上次时间
                requestAnimationFrame(render1);
                renderer.render(scene,camera);//执行渲染操作
                obj.rotateY(0.001*t);//旋转角速度0.001弧度每毫秒
            }
            render1();

        });


    };
    /**
     * 加载obj模型以及贴图渲染
     */
    this.loadOBJ=function () {
        let loaderObj=new THREE.OBJLoader();
        let loaderMtl=new THREE.MTLLoader();

        loaderMtl.load('fbx/nianshou.mtl',function (mater) {

           loaderObj.setMaterials(mater);

            loaderObj.load('fbx/nianshou.obj',function (obj) {
                obj.children[0].material.color.set(0xff0000);
                console.log(obj.children);
                scene.add(obj);

            });

        });





    };

    /**
     * 创建盒子
     */
    this.createBox = function () {
        /**
         * 创建一个球体几何对象
         */
        let geometry = new THREE.BoxGeometry(10, 10, 10); //创建一个立方体几何对象Geometry
        let material = new THREE.MeshLambertMaterial({
            color: 0xffffff
        }); //材质对象Material
        var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
        scene.add(mesh); //网格模型添加到场景中


    };


    /**
     * 创建渲染器对象
     */
    this.render = function () {

        renderer.setSize(w, h);//设置渲染区域尺寸
        renderer.setClearColor(0x000000, 1); //设置背景颜色
        document.body.appendChild(renderer.domElement); //body元素中插入canvas对象
        //执行渲染操作   指定场景、相机作为参数
        renderer.render(scene, camera);

        var clock = new THREE.Clock();

        // 渲染函数
        function render() {
            renderer.render(scene, camera); //执行渲染操作
            requestAnimationFrame(render); //请求再次执行渲染函数render，渲染下一帧

            if (mixer !== null) {
                //clock.getDelta()方法获得两帧的时间间隔
                // 更新混合器相关的时间
                mixer.update(clock.getDelta());
            }
        }

        render();

    };


};

